/**
 * 回调函数id
 */
let _id = 0;

/**
 * 回调函数
 * @param datas 参数列表
 */
interface ICallback<T> {
    (...data: T[]): void
}

/**
 * 回调函数对象
 * @param id 回调函数对象的id
 * @param callback 回调函数
 */
interface IHandle<T> {
    id: number,
    callback: ICallback<T>
}

/**
 * 创建回调函数对象
 * @param func 回调函数
 * @returns 回调函数对象
 */
const CreateHandle = <T>(func: ICallback<T>): IHandle<T> => {
    return { id: _id++, callback: func };
};

/**
 * 创建回调函数对象到集合
 * @param func 回调函数
 * @param handles 存放新生成的回调函数对象的集合
 * @returns 回调函数对象
 */
const CreateHandleTo = <T>(func: ICallback<T>, handles: IHandle<T>[]): IHandle<T> => {
    const handle = CreateHandle<T>(func);
    handles.push(handle);
    return handle;
};

/**
 * 从集合中移除回调函数对象
 * @param handle 目标回调函数对象或其id
 * @param handles 存放有目标函数对象的集合
 */
const RemoveHandle = (handle: number | IHandle<any>, handles: Array<IHandle<any>>): void => {
    const isId = typeof handle === 'number';
    const idx = handles.findIndex(h => isId ? handle === h.id : handle.id === h.id);
    if (idx >= 0) handles.splice(idx, 1);
};


export { CreateHandle, RemoveHandle, CreateHandleTo };
export type { ICallback, IHandle };